// src/api/contract.js
//文件下载请求
import axios from 'axios'
import { ElMessage, ElLoading } from 'element-plus'
import auth from '@/components/utils/auth';

// 下载合同文件（参数：合同ID）
export const downloadContract = async (param, fileUrl) => {
  const loading = ElLoading.service({ text: '文件下载中...' })
  const token = auth.getToken()
  try {
    const response = await axios({
      url:  import.meta.env.VITE_BASE_API +fileUrl, // 后端接口路径（根据你的实际路径调整）
      method: 'get', // 后端是GET请求（根据你的接口定义调整，若为POST则改method）
      params: param, // 传递合同ID（与后端参数名一致）
      headers: {
        Authorization: `Bearer ${token}`
      },
      responseType: 'blob', // 关键：接收二进制流
      timeout: 60000 // 大文件可适当延长超时时间
    })
    // 处理成功响应（文件流）
    handleDownloadResponse(response)
  } catch (error) {
    // 处理错误（后端可能返回404/500等错误）
    handleDownloadError(error)
  } finally {
    loading.close()
  }
}

// 修改前端 handleDownloadResponse 中的文件名解析逻辑
const handleDownloadResponse = (response) => {
  const blob = new Blob([response.data], {
    type: response.headers['content-type'] || 'application/octet-stream'
  });

  const contentDisposition = response.headers['content-disposition'];
  let fileName = '未知文件';

  if (contentDisposition) {
    // 兼容两种格式：先尝试匹配 filename*=UTF-8''xxx，再尝试 filename="xxx"
    let fileNameMatch = contentDisposition.match(/filename\*=UTF-8''(.+)/);
    if (!fileNameMatch) {
      // 匹配 filename="xxx" 格式（注意处理引号和可能的编码）
      fileNameMatch = contentDisposition.match(/filename="(.+)"/);
    }
    if (fileNameMatch && fileNameMatch[1]) {
      // 解码并替换可能的空格编码（+ 或 %20）
      fileName = decodeURIComponent(fileNameMatch[1].replace(/\+/g, '%20'));
    }
  }

  // 兜底：如果文件名仍无后缀，从 Content-Type 推断（可选）
  if (!fileName.includes(".") && response.headers['content-type']) {
    const contentType = response.headers['content-type'];
    const suffixMap = mySuffixMap;
    const suffix = suffixMap[contentType];
    if (suffix) {
      fileName += suffix;
    }
  }

  // 触发下载（同上）
  const url = URL.createObjectURL(blob);
  const a = document.createElement('a');
  a.href = url;
  a.download = fileName;
  document.body.appendChild(a);
  a.click();
  document.body.removeChild(a);
  URL.revokeObjectURL(url);
};

// 处理下载错误（后端返回404/500等状态码）
const handleDownloadError = (error) => {
  if (error.response && error.response.data) {
    // 错误响应可能是blob类型（需转为文本）
    const blob = error.response.data
    const reader = new FileReader()
    reader.onload = () => {
      const errorMsg = reader.result || '下载失败'
      ElMessage.error(errorMsg)
    }
    reader.readAsText(blob) // 将blob转为文本
  } else {
    ElMessage.error('下载失败：' + (error.message || '网络错误'))
  }
}

const mySuffixMap = {
  // 文档类
  'application/pdf': '.pdf',
  'application/msword': '.doc', // Word 97-2003
  'application/vnd.openxmlformats-officedocument.wordprocessingml.document': '.docx', // Word 2007+
  'application/vnd.ms-excel': '.xls', // Excel 97-2003
  'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': '.xlsx', // Excel 2007+
  'application/vnd.ms-powerpoint': '.ppt', // PowerPoint 97-2003
  'application/vnd.openxmlformats-officedocument.presentationml.presentation': '.pptx', // PowerPoint 2007+
  'application/rtf': '.rtf', // RTF文档
  'application/vnd.visio': '.vsd', // Visio

  // 压缩包类
  'application/zip': '.zip',
  'application/x-rar-compressed': '.rar',
  'application/x-7z-compressed': '.7z',
  'application/x-tar': '.tar',
  'application/gzip': '.gz', // .tar.gz 等

  // 图片类
  'image/jpeg': '.jpg',
  'image/png': '.png',
  'image/gif': '.gif',
  'image/bmp': '.bmp',
  'image/svg+xml': '.svg',
  'image/tiff': '.tiff',
  'image/webp': '.webp',

  // 文本类
  'text/plain': '.txt',
  'text/csv': '.csv',
  'application/json': '.json',
  'application/xml': '.xml',
  'text/html': '.html',
  'text/markdown': '.md',

  // 音视频类
  'audio/mpeg': '.mp3',
  'audio/wav': '.wav',
  'audio/mp4': '.m4a',
  'video/mp4': '.mp4',
  'video/mpeg': '.mpeg',
  'video/quicktime': '.mov', // QuickTime
  'video/x-msvideo': '.avi',
  'video/x-matroska': '.mkv',

  // 其他常见格式
  'application/octet-stream': '.bin', // 二进制文件（默认兜底）
  'application/pdf': '.pdf', // 重复标注，确保覆盖
  'application/x-sh': '.sh', // Shell脚本
  'application/x-python': '.py', // Python脚本
  'application/java-archive': '.jar', // JAR包
  'application/vnd.android.package-archive': '.apk' // Android安装包
};